const OpenAI = require('openai');
const { query, testConnection } = require('../lib/db');
const { getDeepseekExplanation } = require('../deepseekAPi');

/**
 * 解析 JSON 字符串，支持提取 markdown 代码块中的 JSON
 * @param {string} text - 可能包含 markdown 代码块的 JSON 字符串
 * @returns {Object} 解析后的 JSON 对象
 */
const parseJson = async (text) => {
    if (!text || typeof text !== 'string') {
        throw new Error('输入文本不能为空');
    }

    // 去除首尾空白
    let cleanedText = text.trim();

    // 如果包含 markdown 代码块标记，提取其中的 JSON
    const codeBlockRegex = /```(?:json)?\s*([\s\S]*?)```/;
    const match = cleanedText.match(codeBlockRegex);
    
    if (match) {
        // 提取代码块中的内容
        cleanedText = match[1].trim();
    }

    // 尝试解析 JSON
    try {
        return JSON.parse(cleanedText);
    } catch (error) {
        console.error('JSON 解析失败:', error.message);
        console.error('原始文本:', text);
        throw new Error(`JSON 解析失败: ${error.message}`);
    }
}

const translateWord = async (word) => {
    // 先查询数据库中是否存在
    const result = await query('SELECT * FROM word WHERE name = ?', [word]);
    if (result.length > 0) {
        return {
            desc: result[0].desc,
            example: result[0].example,
            errtip: result[0].errtip
        };
    }
    let text = null;
    let parsedData = null;
    try {

    const completion = await getDeepseekExplanation(word + `。解释这个成语或词语的意思，要包含这个成语的解释、列句、易错提示。返回一个JSO格式，格式如下：{ 'desc': '解释', 'example': '列句', 'errtip': '易错提示' }`);
    text = completion.choices[0].message.content;
    console.log('text', text);
    parsedData = await parseJson(text);
    await query('INSERT INTO word (name, `desc`, example, errtip) VALUES (?, ?, ?, ?)', [word, parsedData.desc, parsedData.example, parsedData.errtip]);

    } catch (error) {
        console.error('解释成语或词语失败:', error.message);
        return { desc: null, example: null, errtip: null };
    }

    return {
        desc: parsedData?.desc,
        example: parsedData?.example,
        errtip: parsedData?.errtip
    };
}

const translateWordQQ = async (word) => {
    const result = await translateWord(word);
    
    return `【解释】: ${result.desc}\n【例句】: ${result.example}\n【易错提示】: ${result.errtip}`;
}

if (require.main === module) {
    testConnection().then(result => {
        translateWordQQ('吉光片羽');
    });
}


module.exports = { translateWord, translateWordQQ };
